#include <iostream>
#include <vector>
#include <string>
#include <unistd.h>
#include <pthread.h>
#include <string.h>
#define NUM 4
using namespace std;

struct ThreadData
{   
    ThreadData(int i) 
    {
        _threadName = "Thread-" + to_string(i);
    }
    string _threadName;
};

// 共享资源，票
int ticket = 1000;

void* GetTicket(void* args)
{
    ThreadData* data = static_cast<ThreadData*>(args);
    const char* name = data->_threadName.c_str();
    while(true) {
        // 抢票
        printf("%s get a ticket, ticket: %d\n", name, ticket);
        ticket--;
        if(ticket <= 0) {
            // 没票了，该线程就break
            printf("%s can not get ticket, done\n", name);
            break;
        }
        usleep(1000);
    }
    return nullptr;
}

int main()
{
    vector<pthread_t> tids;
    vector<ThreadData*> datas;
    for(size_t i = 1; i <= NUM; ++i) {
        ThreadData* data = new ThreadData(i);
        datas.push_back(data);
        pthread_t tid;
        pthread_create(&tid, nullptr, GetTicket, datas[i-1]);
        tids.push_back(tid);
    }

    // 善后处理
    for(const auto& t : tids)    pthread_join(t, nullptr);
    for(const auto& d : datas)   delete d;
    return 0;
}


// __thread unsigned long int self = 0;
// __thread int tPid = 0;
// void* ThreadRoutine(void* args)
// {
//     ThreadData* td = static_cast<ThreadData*>(args);
//     self = pthread_self();
//     tPid = getpid();
//     // 自己分离
//     pthread_detach(self);
//     int cnt = 5;
//     while(cnt--) {
//         printf("%s, tid: %p, pid: %d\n", td->_threadName.c_str(), self, tPid);
//         sleep(1);
//     }
//     delete td;
//     return nullptr;
// }

// int main()
// {
//     // 创建多个线程
//     vector<pthread_t> tids;
//     for (size_t i = 0; i < NUM; i++) {
//         pthread_t tid;
//         ThreadData* td = new ThreadData("Thread-" + to_string(i+1));
//         // 给子线程传递数据，堆空间是共享的
//         pthread_create(&tid, nullptr, ThreadRoutine, td);
//         tids.push_back(tid);
//     }
//     sleep(2);
//     // 等待线程
//     for(const auto& t : tids) {
//         int ret = pthread_join(t, nullptr);
//         printf("ret: %d, who: %p, why: %s\n", ret, t, strerror(ret));
//     }
    
//     return 0;
// }